﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
using System.Xml.Linq;
using XingFuStudio.Pioneer.Entity;

namespace XingFuStudio.Pioneer.Data {
    /// <summary>
    /// 开心网好友信息数据访问类
    /// </summary>
    public class DbFriend {
        /// <summary>
		/// 存放Xml文档路径
		/// </summary>
		private readonly string xmlPath = String.Empty;

		/// <summary>
        /// 创建一个<see cref="DbFriend"/>实例
		/// </summary>
        public DbFriend() {
            //获取XML文档所在的文件夹
            string xmlFolder = ConfigurationManager.AppSettings["XmlFolder"];

            //判断是否设置了数据文件夹
            if (String.IsNullOrEmpty(xmlFolder)) {
                xmlFolder = "Data";
            }

            //判断设置的数据文件夹是否存在
            if (!Directory.Exists(xmlFolder)) {
                //不存在,创建数据文件夹
                Directory.CreateDirectory(xmlFolder);
            }

            //获取XML文件名称
            string xmlFile =  ConfigurationManager.AppSettings["FriendXml"];

            //判断是否设置了XML文件名称
            if (String.IsNullOrEmpty(xmlFile)) {
                xmlFile = "Friends.xml";
            }

            this.xmlPath = xmlFolder + "\\" + xmlFile;

            //判断指定的数据文件是否存在
            if (!File.Exists(xmlPath)) {
                //初始化指定的数据文件
                XDocument xmlDoc = new XDocument(
                    new XElement("Friends"));

                //存储数据文件
                xmlDoc.Save(xmlPath);
            }
		}

		/// <summary>
        /// 创建好友信息
		/// </summary>
        /// <param name="friend">好友信息</param>
		public bool CreateFriend(FriendInfo friend){
            //判断是否已经存在
            if (this.ExistFriend(friend.UserId)) {
                return false;
            }

            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(xmlPath);

                //创建新的帐户Xml对象
                XElement newFriend = new XElement("Friend",
                    new XAttribute("FriendId", friend.UserId),
                    new XElement("FriendName", friend.UserName),
                    new XElement("Gender", (int)friend.Gender)
                    );

                //添加到现有Xml中
                xmlContent.Add(newFriend);

                //保存Xml
                xmlContent.Save(xmlPath);

                //添加成功
                flag = true;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回查询结果
            return flag;
		}

		/// <summary>
        /// 删除指定好友信息
		/// </summary>
		/// <returns>操作是否成功</returns>
        /// <param name="friendId">好友ID</param>
		public bool DeleteFriend(string friendId){
            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(xmlPath);

                //删除满足条件的帐户信息
                xmlContent.Elements("Friend")
                    .Where(s => s.Attribute("FriendId").Value.ToLower() == friendId.ToLower())
                    .Remove();

                //存储修改后的结果
                xmlContent.Save(xmlPath);

                flag = true;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回查询结果
            return flag;
		}

		/// <summary>
		/// 获取指定的好友是否已经存在
		/// </summary>
		/// <returns>是否已经存在</returns>
        /// <param name="friendId">好友ID</param>
		public bool ExistFriend(string friendId){
            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(xmlPath);

                //查询满足条件的帐户数量
                int count = xmlContent.Elements("Friend")
                    .Count(s => s.Attribute("FriendId").Value.ToLower() == friendId.ToLower());

                //赋值结果
                flag = count > 0;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回查询结果
            return flag;
		}

		/// <summary>
		/// 获取指定的好友信息
		/// </summary>
        /// <returns>一个<see cref="FriendInfo"/>对象</returns>
        /// <param name="friendId">好友ID</param>
		public FriendInfo GetFriend(string friendId){
            //声明开心网帐户信息对象
            FriendInfo info = new FriendInfo();

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(xmlPath);

                //使用Linq查询满足条件的帐户信息
                IEnumerable<XElement> res =
                    xmlContent.Elements("Friend")
                    .Where(s => s.Attribute("FriendId").Value.ToLower() == friendId.ToLower());

                //赋值查询信息
                foreach (XElement item in res) {
                    //赋值信息
                    info.UserId = item.Attribute("FriendId").Value;
                    info.UserName = item.Element("FriendName").Value;
                    info.Gender = (Gender)Convert.ToInt32(item.Element("Gender").Value);
                }
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回帐户信息
            return info;
		}

		/// <summary>
        /// 获取全部好友信息
		/// </summary>
        /// <returns>一个<see cref="FriendInfo"/>集合</returns>
        public List<FriendInfo> GetFriends() {
            //声明开心网帐户信息集合
            List<FriendInfo> collection = new List<FriendInfo>();

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(xmlPath);

                //遍历所有帐户
                foreach (XElement item in xmlContent.Nodes().OfType<XElement>()) {
                    //声明登录帐户信息对象
                    FriendInfo info = new FriendInfo();

                    //赋值信息
                    info.UserId = item.Attribute("FriendId").Value;
                    info.UserName = item.Element("FriendName").Value;
                    info.Gender = (Gender)Convert.ToInt32(item.Element("Gender").Value);

                    //将信息添加到集合
                    collection.Add(info);
                }
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回帐户信息集合
            return collection;
		}

		/// <summary>
		/// 更新指定好友信息
		/// </summary>
		/// <returns>操作是否成功</returns>
        /// <param name="friend">好友信息</param>
        public bool UpdateFriend(FriendInfo friend) {
            //声明标识
            bool flag = false;

            try {
                //获取现有Xml文档数据
                XElement xmlContent = XElement.Load(xmlPath);

                //使用Linq查询满足条件的帐户信息
                IEnumerable<XElement> res =
                     xmlContent.Elements("Friend")
                    .Where(s => s.Attribute("FriendId").Value.ToLower() == friend.UserId.ToLower());

                //赋值查询信息
                foreach (XElement item in res) {
                    //修改数据
                    item.SetElementValue("FriendName", friend.UserName);
                    item.SetElementValue("Gender", (int)friend.Gender);
                }

                //存储修改后的结果
                xmlContent.Save(xmlPath);

                flag = true;
            } catch (Exception ex) {
                //添加失败，记录系统运行日志
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }

            //返回查询结果
            return flag;
		}
    }
}
